
package highvoltage;

import highvoltage.skeletonHelpers.Logger;

import java.util.LinkedList;
import java.util.List;

/**
 * A világot reprezentáló osztály. Gondoskodik az út hálózat felépítésérõl,
 * nyilvántartja annak elemeit, és közvetíti az órajelet ezen elemekhez.
 * 
 * @author Tomi
 * @version 1.0
 * @created 16-márc.-2010 21:08:08
 */
public class World implements ISteppable
{
	/**
	 * A játékosra mutató referencia.
	 */
	private Robber _player;
	/**
	 * A rendõrre mutató referencia.
	 */
	private Police _police;
	/**
	 * A világban található források listája.
	 */
	private List<SourceRoadSegment> _sources;
	/**
	 * A léptethetõ elemeket tároló attribútum.
	 */
	private List<ISteppable> _steppables = new LinkedList<ISteppable>();

	private static World _instance = new World();

	private World()
	{
	}

	/**
	 * Visszaadja az egyetlen World példányt.
	 */
	public static World getInstance()
	{
		return _instance;
	}

	/**
	 * A játék kudarccal végyõdött.
	 */
	public void loseGame()
	{
		Logger.print( "World::loseGame()", this );
		Logger.ret();
	}

	/**
	 * Felveszi a paraméterként kapott objektumot a _steppables listára.
	 * 
	 * @param steppable
	 *            IStepable interfészt megvalósító objektum.
	 */
	public void registerSteppable( ISteppable steppable )
	{
		Logger.print( String.format( "World::registerSteppable(steppable | %d)", steppable.hashCode() ), this );

		_steppables.add( steppable );

		Logger.ret();
	}

	/**
	 * Órajelütésre lépteti a benne lévõ órajelre léptethetõ objektumokat.
	 */
	public void step()
	{
		Logger.print( "World::step()", this );

		for ( ISteppable ist : _steppables )
		{
			Logger.call( "ISteppable::step()", ist );
			ist.step();
		}

		Logger.ret();
	}

	/**
	 * Rendõr "elpusztításáról" gondoskodik.
	 * 
	 * @param vehicle
	 *            Rendõr típusú jármû.
	 */
	public void visitVehicle( Police vehicle )
	{
		Logger.print( "World::visitVehicle(Police vehicle)", this );
		Logger.ret();
	}

	/**
	 * Civil "elpusztításáról" gondoskodik.
	 * 
	 * @param vehicle
	 *            Civil típusú jármû.
	 */
	public void visitVehicle( Civilian vehicle )
	{
		Logger.print( "World::visitVehicle(Civilian vehicle)", this );
		Logger.ret();
	}

	/**
	 * Rabló "elpusztításáról" gondoskodik, kezeli a játék vége eseményt.
	 * 
	 * @param vehicle
	 *            Rabló típusú jármû.
	 */
	public void visitVehicle( Robber vehicle )
	{
		Logger.print( "World::visitVehicle(Robber vehicle)", this );
		Logger.ret();
	}

	/**
	 * A játék sikerrel végyõdött.
	 */
	public void winGame()
	{
		Logger.print( "World::winGame()", this );
		Logger.ret();
	}

	/**
	 * Létrehozza a pályát.
	 */
	public void buildMap()
	{
		Logger.print( "World::buildMap()", this );
		Logger.ret();
	}

}
